package cn.springboot.utils;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.StringUtils;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.reflect.TypeToken;

/**
 * @author liufl E-mail:Huberier@allpyra.com
 * @version 创建时间：2017年9月19日 下午6:24:29 
 * Gson 谷歌的JSON处理工具， 好处是不用担心缺失的属性
 * 
 */
public class GsonUtils {
	private static final Gson gson = new GsonBuilder().disableHtmlEscaping() .create();

	/**
	 * <pre>
	 * JSON字符串转换为List数组, 提供两种方式(主要解决调用的容易程度)
	 * 1. TypeToken<List<T>> token 参数转换
	 * 2. Class<T> cls 方式转换
	 * 
	 * @param json
	 * @return List<T>
	 * 
	 * <pre>
	 */
	public static <T> List<T> jsonStr2List(String json, TypeToken<List<T>> token) {
		if (StringUtils.isBlank(json)) {
			return new ArrayList<T>();
		}
		return gson.fromJson(json, token.getType());
	}

	/**
	 * <pre>
	 * Json格式转换, 由JSON字符串转化到指定类型T
	 * 
	 * @param json
	 * @param cls
	 * @return T
	 * 
	 * <pre>
	 */
	public static <T> T jsonStr2Obj(String json, Class<T> cls) {
		if (StringUtils.isBlank(json)) {
			return null;
		}
		return gson.fromJson(json, cls);
	}

	/**
	 * <pre>
	 * java对象转化JSON
	 * 
	 * @return String
	 * 
	 * <pre>
	 */
	public static String obj2JsonStr(Object obj) {
		if (obj == null) {
			return "";
		}
		return gson.toJson(obj);
	}
	public static JsonObject obj2Json(Object obj) {
		if (obj == null) {
			return null;
		}
		String jsonStr = gson.toJson(obj);
		return new JsonParser().parse(jsonStr).getAsJsonObject();
	}
	public static JsonArray str2JsonArr(String jsonStr) {
		if (jsonStr == null) {
			return null;
		}
		return new JsonParser().parse(jsonStr).getAsJsonArray();
	}
	
	@SuppressWarnings({ "unchecked", "rawtypes" })
	public static Object JSONToObject(String json,Class beanClass) {
	    Gson gson = new Gson();
	    Object res = gson.fromJson(json, beanClass);
	    return res;
	}
	/**
	 * 从JSON对象中获取指定key的vlaue值（String类型）
	 * @param jsonObject
	 * @param name
	 * @return
	 */
	public static String getStringFromJson(JsonObject jsonObject,
			String name) {
		if (jsonObject == null || StringUtils.isBlank(name)) {
			return null;
		}
		JsonElement jsonElement = jsonObject.get(name);
		return (jsonElement == null) ? null : jsonElement.getAsString();
	}

	/**
	 * 从JSON对象中获取指定key的vlaue值（JsonObject类型）
	 * @param jsonObject
	 * @param name
	 * @return
	 */
	public static JsonObject getJsonFromJson(JsonObject jsonObject,
			String name) {
		if (jsonObject == null || StringUtils.isBlank(name)) {
			return null;
		}
		JsonElement jsonElement = jsonObject.get(name);
		return (jsonElement == null) ? null : jsonElement.getAsJsonObject();
	}

	/**
	 * 从JSON对象中获取指定key的vlaue值（boolean类型）
	 * @param jsonObject
	 * @param name
	 * @return
	 */
	public static boolean getBoolFromJson(JsonObject jsonObject,
			String name) {
		if (jsonObject == null || StringUtils.isBlank(name)) {
			return false;
		}
		JsonElement jsonElement = jsonObject.get(name);
		return (jsonElement == null) ? false : jsonElement.getAsBoolean();
	}

	/**
	 * 从JSON对象中获取指定key的vlaue值（boolean类型）
	 * @param jsonObject
	 * @param name
	 * @return
	 */
	public static Integer getIntFromJson(JsonObject jsonObject,
			String name) {
		if (jsonObject == null || StringUtils.isBlank(name)) {
			return null;
		}
		JsonElement jsonElement = jsonObject.get(name);
		return (jsonElement == null) ? null : jsonElement.getAsInt();
	}

	/**
	 * 从JSON对象中获取指定key的vlaue值（boolean类型）
	 * @param jsonObject
	 * @param name
	 * @return
	 */
	public static BigDecimal getDecimalFromJson(JsonObject jsonObject,
			String name) {
		if (jsonObject == null || StringUtils.isBlank(name)) {
			return null;
		}
		JsonElement jsonElement = jsonObject.get(name);
		return (jsonElement == null) ? null : jsonElement.getAsBigDecimal();
	}
}
